template <class C>
inline bool is_corner_9(const unsigned char* p,
                        const int w,
                        const short barrier) {
  const int w3 = 3 * w;
  const short t = C::prep_t(*p, barrier);
  if (!C::eval(p[-1 - w3], t)) {  // ???????????????-
    if (!C::eval(p[w3], t)) {     // ????????-??????-
      return false;
    }                              // ????????@??????-
    if (!C::eval(p[1 + w3], t)) {  // ???????-@??????-
      return false;
    }                                 // ???????@@??????-
    if (!C::eval(p[2 + 2 * w], t)) {  // ??????-@@??????-
      return false;
    }                                    // ??????@@@??????-
    if (!C::eval(p[3 + w], t)) {         // ?????-@@@??????-
      if (!C::eval(p[-2 - 2 * w], t)) {  // ?????-@@@?????--
        return false;
      }                              // ?????-@@@?????@-
      if (!C::eval(p[-3 - w], t)) {  // ?????-@@@????-@-
        return false;
      }                               // ?????-@@@????@@-
      if (!C::eval(p[-1 + w3], t)) {  // ?????-@@@-???@@-
        return false;
      }                                  // ?????-@@@@???@@-
      if (!C::eval(p[-2 + 2 * w], t)) {  // ?????-@@@@-??@@-
        return false;
      }                              // ?????-@@@@@??@@-
      if (!C::eval(p[-3 + w], t)) {  // ?????-@@@@@-?@@-
        return false;
      }                          // ?????-@@@@@@?@@-
      if (!C::eval(p[-3], t)) {  // ?????-@@@@@@-@@-
        return false;
      }  // ?????-@@@@@@@@@-
      return true;
    }                                // ?????@@@@??????-
    if (!C::eval(p[3], t)) {         // ????-@@@@??????-
      if (!C::eval(p[-3 - w], t)) {  // ????-@@@@????-?-
        return false;
      }                               // ????-@@@@????@?-
      if (!C::eval(p[-1 + w3], t)) {  // ????-@@@@-???@?-
        return false;
      }                                  // ????-@@@@@???@?-
      if (!C::eval(p[-2 + 2 * w], t)) {  // ????-@@@@@-??@?-
        return false;
      }                              // ????-@@@@@@??@?-
      if (!C::eval(p[-3 + w], t)) {  // ????-@@@@@@-?@?-
        return false;
      }                          // ????-@@@@@@@?@?-
      if (!C::eval(p[-3], t)) {  // ????-@@@@@@@-@?-
        return false;
      }  // ????-@@@@@@@@@?-
      return true;
    }                                 // ????@@@@@??????-
    if (!C::eval(p[3 - w], t)) {      // ???-@@@@@??????-
      if (!C::eval(p[-1 + w3], t)) {  // ???-@@@@@-?????-
        return false;
      }                                  // ???-@@@@@@?????-
      if (!C::eval(p[-2 + 2 * w], t)) {  // ???-@@@@@@-????-
        return false;
      }                              // ???-@@@@@@@????-
      if (!C::eval(p[-3 + w], t)) {  // ???-@@@@@@@-???-
        return false;
      }                          // ???-@@@@@@@@???-
      if (!C::eval(p[-3], t)) {  // ???-@@@@@@@@-??-
        return false;
      }  // ???-@@@@@@@@@??-
      return true;
    }                               // ???@@@@@@??????-
    if (!C::eval(p[-1 + w3], t)) {  // ???@@@@@@-?????-
      if (!C::eval(p[-w3], t)) {    // -??@@@@@@-?????-
        return false;
      }                              // @??@@@@@@-?????-
      if (!C::eval(p[1 - w3], t)) {  // @-?@@@@@@-?????-
        return false;
      }                                 // @@?@@@@@@-?????-
      if (!C::eval(p[2 - 2 * w], t)) {  // @@-@@@@@@-?????-
        return false;
      }  // @@@@@@@@@-?????-
      return true;
    }                                    // ???@@@@@@@?????-
    if (!C::eval(p[2 - 2 * w], t)) {     // ??-@@@@@@@?????-
      if (!C::eval(p[-2 + 2 * w], t)) {  // ??-@@@@@@@-????-
        return false;
      }                              // ??-@@@@@@@@????-
      if (!C::eval(p[-3 + w], t)) {  // ??-@@@@@@@@-???-
        return false;
      }  // ??-@@@@@@@@@???-
      return true;
    }                                  // ??@@@@@@@@?????-
    if (!C::eval(p[-2 + 2 * w], t)) {  // ??@@@@@@@@-????-
      if (!C::eval(p[1 - w3], t)) {    // ?-@@@@@@@@-????-
        return false;
      }  // ?@@@@@@@@@-????-
      return true;
    }  // ??@@@@@@@@@????-
    return true;
  }                                  // ???????????????@
  if (!C::eval(p[-2 - 2 * w], t)) {  // ??????????????-@
    if (!C::eval(p[3 + w], t)) {     // ?????-????????-@
      return false;
    }                              // ?????@????????-@
    if (!C::eval(p[1 + w3], t)) {  // ?????@?-??????-@
      return false;
    }                                 // ?????@?@??????-@
    if (!C::eval(p[2 + 2 * w], t)) {  // ?????@-@??????-@
      return false;
    }                                // ?????@@@??????-@
    if (!C::eval(p[3], t)) {         // ????-@@@??????-@
      if (!C::eval(p[-3 - w], t)) {  // ????-@@@?????--@
        return false;
      }                          // ????-@@@?????@-@
      if (!C::eval(p[-3], t)) {  // ????-@@@????-@-@
        return false;
      }                          // ????-@@@????@@-@
      if (!C::eval(p[w3], t)) {  // ????-@@@-???@@-@
        return false;
      }                               // ????-@@@@???@@-@
      if (!C::eval(p[-1 + w3], t)) {  // ????-@@@@-??@@-@
        return false;
      }                                  // ????-@@@@@??@@-@
      if (!C::eval(p[-2 + 2 * w], t)) {  // ????-@@@@@-?@@-@
        return false;
      }                              // ????-@@@@@@?@@-@
      if (!C::eval(p[-3 + w], t)) {  // ????-@@@@@@-@@-@
        return false;
      }  // ????-@@@@@@@@@-@
      return true;
    }                             // ????@@@@??????-@
    if (!C::eval(p[3 - w], t)) {  // ???-@@@@??????-@
      if (!C::eval(p[-3], t)) {   // ???-@@@@????-?-@
        return false;
      }                          // ???-@@@@????@?-@
      if (!C::eval(p[w3], t)) {  // ???-@@@@-???@?-@
        return false;
      }                               // ???-@@@@@???@?-@
      if (!C::eval(p[-1 + w3], t)) {  // ???-@@@@@-??@?-@
        return false;
      }                                  // ???-@@@@@@??@?-@
      if (!C::eval(p[-2 + 2 * w], t)) {  // ???-@@@@@@-?@?-@
        return false;
      }                              // ???-@@@@@@@?@?-@
      if (!C::eval(p[-3 + w], t)) {  // ???-@@@@@@@-@?-@
        return false;
      }  // ???-@@@@@@@@@?-@
      return true;
    }                                 // ???@@@@@??????-@
    if (!C::eval(p[2 - 2 * w], t)) {  // ??-@@@@@??????-@
      if (!C::eval(p[w3], t)) {       // ??-@@@@@-?????-@
        return false;
      }                               // ??-@@@@@@?????-@
      if (!C::eval(p[-1 + w3], t)) {  // ??-@@@@@@-????-@
        return false;
      }                                  // ??-@@@@@@@????-@
      if (!C::eval(p[-2 + 2 * w], t)) {  // ??-@@@@@@@-???-@
        return false;
      }                              // ??-@@@@@@@@???-@
      if (!C::eval(p[-3 + w], t)) {  // ??-@@@@@@@@-??-@
        return false;
      }  // ??-@@@@@@@@@??-@
      return true;
    }                              // ??@@@@@@??????-@
    if (!C::eval(p[1 - w3], t)) {  // ?-@@@@@@??????-@
      if (!C::eval(p[w3], t)) {    // ?-@@@@@@-?????-@
        return false;
      }                               // ?-@@@@@@@?????-@
      if (!C::eval(p[-1 + w3], t)) {  // ?-@@@@@@@-????-@
        return false;
      }                                  // ?-@@@@@@@@????-@
      if (!C::eval(p[-2 + 2 * w], t)) {  // ?-@@@@@@@@-???-@
        return false;
      }  // ?-@@@@@@@@@???-@
      return true;
    }                            // ?@@@@@@@??????-@
    if (!C::eval(p[-w3], t)) {   // -@@@@@@@??????-@
      if (!C::eval(p[w3], t)) {  // -@@@@@@@-?????-@
        return false;
      }                               // -@@@@@@@@?????-@
      if (!C::eval(p[-1 + w3], t)) {  // -@@@@@@@@-????-@
        return false;
      }  // -@@@@@@@@@????-@
      return true;
    }  // @@@@@@@@??????-@
    return true;
  }                                // ??????????????@@
  if (!C::eval(p[-w3], t)) {       // -?????????????@@
    if (!C::eval(p[1 + w3], t)) {  // -??????-??????@@
      return false;
    }                               // -??????@??????@@
    if (!C::eval(p[-1 + w3], t)) {  // -??????@?-????@@
      return false;
    }                          // -??????@?@????@@
    if (!C::eval(p[w3], t)) {  // -??????@-@????@@
      return false;
    }                                   // -??????@@@????@@
    if (!C::eval(p[-2 + 2 * w], t)) {   // -??????@@@-???@@
      if (!C::eval(p[2 + 2 * w], t)) {  // -?????-@@@-???@@
        return false;
      }                             // -?????@@@@-???@@
      if (!C::eval(p[3 + w], t)) {  // -????-@@@@-???@@
        return false;
      }                              // -????@@@@@-???@@
      if (!C::eval(p[1 - w3], t)) {  // --???@@@@@-???@@
        return false;
      }                                 // -@???@@@@@-???@@
      if (!C::eval(p[2 - 2 * w], t)) {  // -@-??@@@@@-???@@
        return false;
      }                             // -@@??@@@@@-???@@
      if (!C::eval(p[3 - w], t)) {  // -@@-?@@@@@-???@@
        return false;
      }                         // -@@@?@@@@@-???@@
      if (!C::eval(p[3], t)) {  // -@@@-@@@@@-???@@
        return false;
      }  // -@@@@@@@@@-???@@
      return true;
    }                                   // -??????@@@@???@@
    if (!C::eval(p[-3 + w], t)) {       // -??????@@@@-??@@
      if (!C::eval(p[2 + 2 * w], t)) {  // -?????-@@@@-??@@
        return false;
      }                                 // -?????@@@@@-??@@
      if (!C::eval(p[2 - 2 * w], t)) {  // -?-???@@@@@-??@@
        return false;
      }                             // -?@???@@@@@-??@@
      if (!C::eval(p[3 - w], t)) {  // -?@-??@@@@@-??@@
        return false;
      }                         // -?@@??@@@@@-??@@
      if (!C::eval(p[3], t)) {  // -?@@-?@@@@@-??@@
        return false;
      }                             // -?@@@?@@@@@-??@@
      if (!C::eval(p[3 + w], t)) {  // -?@@@-@@@@@-??@@
        return false;
      }  // -?@@@@@@@@@-??@@
      return true;
    }                               // -??????@@@@@??@@
    if (!C::eval(p[-3], t)) {       // -??????@@@@@-?@@
      if (!C::eval(p[3 - w], t)) {  // -??-???@@@@@-?@@
        return false;
      }                         // -??@???@@@@@-?@@
      if (!C::eval(p[3], t)) {  // -??@-??@@@@@-?@@
        return false;
      }                             // -??@@??@@@@@-?@@
      if (!C::eval(p[3 + w], t)) {  // -??@@-?@@@@@-?@@
        return false;
      }                                 // -??@@@?@@@@@-?@@
      if (!C::eval(p[2 + 2 * w], t)) {  // -??@@@-@@@@@-?@@
        return false;
      }  // -??@@@@@@@@@-?@@
      return true;
    }                              // -??????@@@@@@?@@
    if (!C::eval(p[-3 - w], t)) {  // -??????@@@@@@-@@
      if (!C::eval(p[3], t)) {     // -???-??@@@@@@-@@
        return false;
      }                             // -???@??@@@@@@-@@
      if (!C::eval(p[3 + w], t)) {  // -???@-?@@@@@@-@@
        return false;
      }                                 // -???@@?@@@@@@-@@
      if (!C::eval(p[2 + 2 * w], t)) {  // -???@@-@@@@@@-@@
        return false;
      }  // -???@@@@@@@@@-@@
      return true;
    }  // -??????@@@@@@@@@
    return true;
  }                                   // @?????????????@@
  if (!C::eval(p[-3 - w], t)) {       // @????????????-@@
    if (!C::eval(p[2 + 2 * w], t)) {  // @?????-??????-@@
      return false;
    }                             // @?????@??????-@@
    if (!C::eval(p[3 + w], t)) {  // @????-@??????-@@
      return false;
    }                         // @????@@??????-@@
    if (!C::eval(p[3], t)) {  // @???-@@??????-@@
      return false;
    }                             // @???@@@??????-@@
    if (!C::eval(p[3 - w], t)) {  // @??-@@@??????-@@
      if (!C::eval(p[-3], t)) {   // @??-@@@?????--@@
        return false;
      }                              // @??-@@@?????@-@@
      if (!C::eval(p[-3 + w], t)) {  // @??-@@@????-@-@@
        return false;
      }                              // @??-@@@????@@-@@
      if (!C::eval(p[1 + w3], t)) {  // @??-@@@-???@@-@@
        return false;
      }                          // @??-@@@@???@@-@@
      if (!C::eval(p[w3], t)) {  // @??-@@@@-??@@-@@
        return false;
      }                               // @??-@@@@@??@@-@@
      if (!C::eval(p[-1 + w3], t)) {  // @??-@@@@@-?@@-@@
        return false;
      }                                  // @??-@@@@@@?@@-@@
      if (!C::eval(p[-2 + 2 * w], t)) {  // @??-@@@@@@-@@-@@
        return false;
      }  // @??-@@@@@@@@@-@@
      return true;
    }                                 // @??@@@@??????-@@
    if (!C::eval(p[2 - 2 * w], t)) {  // @?-@@@@??????-@@
      if (!C::eval(p[-3 + w], t)) {   // @?-@@@@????-?-@@
        return false;
      }                              // @?-@@@@????@?-@@
      if (!C::eval(p[1 + w3], t)) {  // @?-@@@@-???@?-@@
        return false;
      }                          // @?-@@@@@???@?-@@
      if (!C::eval(p[w3], t)) {  // @?-@@@@@-??@?-@@
        return false;
      }                               // @?-@@@@@@??@?-@@
      if (!C::eval(p[-1 + w3], t)) {  // @?-@@@@@@-?@?-@@
        return false;
      }                                  // @?-@@@@@@@?@?-@@
      if (!C::eval(p[-2 + 2 * w], t)) {  // @?-@@@@@@@-@?-@@
        return false;
      }  // @?-@@@@@@@@@?-@@
      return true;
    }                                // @?@@@@@??????-@@
    if (!C::eval(p[1 - w3], t)) {    // @-@@@@@??????-@@
      if (!C::eval(p[1 + w3], t)) {  // @-@@@@@-?????-@@
        return false;
      }                          // @-@@@@@@?????-@@
      if (!C::eval(p[w3], t)) {  // @-@@@@@@-????-@@
        return false;
      }                               // @-@@@@@@@????-@@
      if (!C::eval(p[-1 + w3], t)) {  // @-@@@@@@@-???-@@
        return false;
      }                                  // @-@@@@@@@@???-@@
      if (!C::eval(p[-2 + 2 * w], t)) {  // @-@@@@@@@@-??-@@
        return false;
      }  // @-@@@@@@@@@??-@@
      return true;
    }  // @@@@@@@??????-@@
    return true;
  }                                    // @????????????@@@
  if (!C::eval(p[1 - w3], t)) {        // @-???????????@@@
    if (!C::eval(p[-2 + 2 * w], t)) {  // @-????????-??@@@
      return false;
    }                               // @-????????@??@@@
    if (!C::eval(p[-1 + w3], t)) {  // @-???????-@??@@@
      return false;
    }                          // @-???????@@??@@@
    if (!C::eval(p[w3], t)) {  // @-??????-@@??@@@
      return false;
    }                                // @-??????@@@??@@@
    if (!C::eval(p[-3 + w], t)) {    // @-??????@@@-?@@@
      if (!C::eval(p[1 + w3], t)) {  // @-?????-@@@-?@@@
        return false;
      }                                 // @-?????@@@@-?@@@
      if (!C::eval(p[2 + 2 * w], t)) {  // @-????-@@@@-?@@@
        return false;
      }                                 // @-????@@@@@-?@@@
      if (!C::eval(p[2 - 2 * w], t)) {  // @--???@@@@@-?@@@
        return false;
      }                             // @-@???@@@@@-?@@@
      if (!C::eval(p[3 - w], t)) {  // @-@-??@@@@@-?@@@
        return false;
      }                         // @-@@??@@@@@-?@@@
      if (!C::eval(p[3], t)) {  // @-@@-?@@@@@-?@@@
        return false;
      }                             // @-@@@?@@@@@-?@@@
      if (!C::eval(p[3 + w], t)) {  // @-@@@-@@@@@-?@@@
        return false;
      }  // @-@@@@@@@@@-?@@@
      return true;
    }                                // @-??????@@@@?@@@
    if (!C::eval(p[-3], t)) {        // @-??????@@@@-@@@
      if (!C::eval(p[1 + w3], t)) {  // @-?????-@@@@-@@@
        return false;
      }                             // @-?????@@@@@-@@@
      if (!C::eval(p[3 - w], t)) {  // @-?-???@@@@@-@@@
        return false;
      }                         // @-?@???@@@@@-@@@
      if (!C::eval(p[3], t)) {  // @-?@-??@@@@@-@@@
        return false;
      }                             // @-?@@??@@@@@-@@@
      if (!C::eval(p[3 + w], t)) {  // @-?@@-?@@@@@-@@@
        return false;
      }                                 // @-?@@@?@@@@@-@@@
      if (!C::eval(p[2 + 2 * w], t)) {  // @-?@@@-@@@@@-@@@
        return false;
      }  // @-?@@@@@@@@@-@@@
      return true;
    }  // @-??????@@@@@@@@
    return true;
  }                               // @@???????????@@@
  if (!C::eval(p[-3], t)) {       // @@??????????-@@@
    if (!C::eval(p[3 + w], t)) {  // @@???-??????-@@@
      return false;
    }                         // @@???@??????-@@@
    if (!C::eval(p[3], t)) {  // @@??-@??????-@@@
      return false;
    }                             // @@??@@??????-@@@
    if (!C::eval(p[3 - w], t)) {  // @@?-@@??????-@@@
      return false;
    }                                 // @@?@@@??????-@@@
    if (!C::eval(p[2 - 2 * w], t)) {  // @@-@@@??????-@@@
      if (!C::eval(p[-3 + w], t)) {   // @@-@@@?????--@@@
        return false;
      }                                  // @@-@@@?????@-@@@
      if (!C::eval(p[-2 + 2 * w], t)) {  // @@-@@@????-@-@@@
        return false;
      }                                 // @@-@@@????@@-@@@
      if (!C::eval(p[2 + 2 * w], t)) {  // @@-@@@-???@@-@@@
        return false;
      }                              // @@-@@@@???@@-@@@
      if (!C::eval(p[1 + w3], t)) {  // @@-@@@@-??@@-@@@
        return false;
      }                          // @@-@@@@@??@@-@@@
      if (!C::eval(p[w3], t)) {  // @@-@@@@@-?@@-@@@
        return false;
      }                               // @@-@@@@@@?@@-@@@
      if (!C::eval(p[-1 + w3], t)) {  // @@-@@@@@@-@@-@@@
        return false;
      }  // @@-@@@@@@@@@-@@@
      return true;
    }  // @@@@@@??????-@@@
    return true;
  }                                 // @@??????????@@@@
  if (!C::eval(p[2 - 2 * w], t)) {  // @@-?????????@@@@
    if (!C::eval(p[-1 + w3], t)) {  // @@-??????-??@@@@
      return false;
    }                                  // @@-??????@??@@@@
    if (!C::eval(p[-2 + 2 * w], t)) {  // @@-??????@-?@@@@
      return false;
    }                              // @@-??????@@?@@@@
    if (!C::eval(p[-3 + w], t)) {  // @@-??????@@-@@@@
      return false;
    }  // @@-??????@@@@@@@
    return true;
  }                               // @@@?????????@@@@
  if (!C::eval(p[-3 + w], t)) {   // @@@????????-@@@@
    if (!C::eval(p[3 - w], t)) {  // @@@-???????-@@@@
      return false;
    }                         // @@@@???????-@@@@
    if (!C::eval(p[3], t)) {  // @@@@-??????-@@@@
      return false;
    }  // @@@@@??????-@@@@
    return true;
  }                                    // @@@????????@@@@@
  if (!C::eval(p[3 - w], t)) {         // @@@-???????@@@@@
    if (!C::eval(p[-2 + 2 * w], t)) {  // @@@-??????-@@@@@
      return false;
    }  // @@@-??????@@@@@@
    return true;
  }  // @@@@???????@@@@@
  return true;
}
